package com.quectel.sdk.hik8700.basemodel.event;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.quectel.sdk.hik8700.basemodel.EventBaseDataResp;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.util.Date;
import java.util.List;

/**
 * 区域入侵事件数据
 * <p>
 * Events属性说明：
 * 参数名称	数据类型	属性描述	是否必填	最大长度	备注
 * eventId	String	事件唯一标识	是	64	同一事件若上报多次，则上报事件的eventId相同
 * srcIndex	String	事件源编号，物理设备是资源编号	是	64
 * srcType	String	事件源类型	是	64
 * srcName	String	事件源名称	否	64
 * eventType	Number	事件类型	是	32
 * status	Number	事件状态	是	32	0-瞬时
 * 1-开始
 * 2-停止
 * 4-事件联动结果更新
 * 5-事件图片异步上传
 * eventLvl	Number	事件等级	否	32	事件等级：
 * 0-未配置
 * 1-低
 * 2-中
 * 3-高
 * 注意，此处事件等级是指在事件联动中配置的等级，需要配置了事件联动，才返回这个字段
 * timeout	Number	脉冲超时时间	是	32	单位：秒
 * happenTime	String	事件发生时间（设备时间）	是	64	ISO8601，示例：2018-08-15T 15:53:47.000+08:00
 * srcParentIndex	String	事件发生的事件源父设备编码	否	64
 * data	Data	事件其它扩展信息	否	不限
 * Data属性说明：
 * 参数名称	数据类型	属性描述	是否必填	最大长度	备注
 * dataType	String	数据模型标识	是	64	由IAC添加
 * recvTime	String	数据接收时间	是	64	由IAC添加
 * sendTime	String	数据发送时间	是	64	由IAC添加
 * dateTime	String	数据触发时间	是	64	由设备产生
 * ipAddress	String	设备的IP地址	是	64
 * portNo	Number	设备端口号	是	32
 * channelID	Number	设备通道号	是	32	设备通道号，默认1开始
 * eventDescription	String	事件类型名称	是	64
 * eventType	String	事件类型	是	64	事件类型
 * fielddetection	Object[]	分析结果	是	不限
 * + targetAttrs	Object	透传字段	否	不限	透传字段，部分字段由数据源扩展字段获取
 * ++ imageServerCode	String	图片服务编号	否	64
 * ++ deviceIndexCode	String	设备编号，平台关联的编码	是	64
 * ++ cameraIndexCode	String	监控点编码，平台关联的编码	是	64
 * ++ channelName	String	通道名称	是	64
 * ++ cameraAddress	String	监控点安装地址	否	64
 * ++ longitude	Number	监控点所在经度	否	32	监控点所在经度，float 类型
 * ++ latitude	Number	监控点所在纬度	否	32	监控点所在纬度，float 类型
 * + imageUrl	String	背景图URL	否	64
 * + duration	Number	行为事件触发时间阈值	否	32	行为事件触发时间阈值，判断有效报警时间
 * + sensitivityLevel	Number	灵敏度参数	否	32	灵敏度参数，取值范围：[1,100]
 * + rate	Number	占比	否	32	占比：区域内所有未报警目标尺寸目标占区域面积的比重，归一化为1~100
 * + detectionTarget	Number	检测目标	否	32	检测目标, 0-所有，1-人，2-车，3-人和车
 * + regionCoordinatesList	Object[]	区域范围	是（ehome接入可选）	不限
 * ++ positionX	Number	X轴坐标	否	32	X轴坐标，取值范围[0.001,1]
 * ++ positionY	Number	Y轴坐标	否	32	Y轴坐标，取值范围[0.001,1]
 *
 * @author: rananxin
 * @email: ryan.ran@quectel.com
 * @date: 2022-10-21 15:41:00
 */
@NoArgsConstructor
@Data
@EqualsAndHashCode(callSuper=true)
public class EventRuleData extends EventBaseDataResp.EventDataCls {


    /**
     * data
     */
    private DataCls data;
    /**
     * eventId
     */
    private String eventId;
    /**
     * eventType
     */
    private Integer eventType;
    /**
     * happenTime
     */
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT+8")
    private String happenTime;
    /**
     * srcIndex
     */
    private String srcIndex;
    /**
     * srcName
     */
    private String srcName;
    /**
     * srcType
     */
    private String srcType;
    /**
     * status
     */
    private Integer status;
    /**
     * timeout
     */
    private Integer timeout;

    /**
     * DataCls
     */
    @NoArgsConstructor
    @Data
    public static class DataCls {
        /**
         * dataType
         */
        private String dataType;
        /**
         * recvTime
         */
        @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT+8")
        private Date recvTime;
        /**
         * sendTime
         */
        @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT+8")
        private Date sendTime;
        /**
         * dateTime
         */
        @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT+8")
        private Date dateTime;
        /**
         * ipAddress
         */
        private String ipAddress;
        /**
         * portNo
         */
        private Integer portNo;
        /**
         * channelID
         */
        private Integer channelID;
        /**
         * eventType
         */
        private String eventType;
        /**
         * eventDescription
         */
        private String eventDescription;
        /**
         * fielddetection
         */
        private List<FielddetectionCls> fielddetection;

        /**
         * FielddetectionCls
         */
        @NoArgsConstructor
        @Data
        public static class FielddetectionCls {
            /**
             * targetAttrs
             */
            private TargetAttrsCls targetAttrs;
            /**
             * imageUrl
             */
            private String imageUrl;
            /**
             * duration
             */
            private Integer duration;
            /**
             * sensitivityLevel
             */
            private Integer sensitivityLevel;
            /**
             * rate
             */
            private Integer rate;
            /**
             * detectionTarget
             */
            private Integer detectionTarget;
            /**
             * regionCoordinatesList
             */
            private List<RegionCoordinatesListCls> regionCoordinatesList;

            /**
             * TargetAttrsCls
             */
            @NoArgsConstructor
            @Data
            public static class TargetAttrsCls {
                /**
                 * imageServerCode
                 */
                private String imageServerCode;
                /**
                 * deviceIndexCode
                 */
                private String deviceIndexCode;
                /**
                 * cameraIndexCode
                 */
                private String cameraIndexCode;
                /**
                 * channelName
                 */
                private String channelName;
                /**
                 * cameraAddress
                 */
                private String cameraAddress;
                /**
                 * longitude
                 */
                private Double longitude;
                /**
                 * latitude
                 */
                private Double latitude;
            }

            /**
             * RegionCoordinatesListCls
             */
            @NoArgsConstructor
            @Data
            public static class RegionCoordinatesListCls {
                /**
                 * positionX
                 */
                private Double positionX;
                /**
                 * positionY
                 */
                private Double positionY;
            }
        }
    }
}
